// 范围内的数字计数
// 给定两个正整数a和b，求在[a,b] 中的所有整数中
// 每个数码(digit)各出现了多少次
// 测试链接 : https://www.luogu.com.cn/problem/P2602
// 提交以下命名空间中的code，可以直接通过

namespace Code1
{

#include <bits/stdc++.h>

using namespace std;

// 统计1~num范围上所有的数中，数码d出现了多少次
// 注意是1~num范围，不是0~num范围
long count(long num, int d)
{
    long ans = 0;
    // left : 当前位左边的情况数
    // right : 当前位右边的情况数
    // 当前位的数字是cur
    for(long right = 1, tmp = num, left, cur; tmp != 0; right *= 10, tmp /= 10)
    {
        // 情况1：
        // d != 0
        // 1 ~ 30583 , d = 5
        // cur < d的情况
        // 个位cur=3 : 0000~3057 5
        // 个位上没有额外加
        //
        // cur > d的情况
        // 十位cur=8 : 000~304 5 0~9
        // 十位上额外加 : 305 5 0~9
        //
        // cur == d的情况
        // 百位cur=5 : 00~29 5 00~99
        // 百位上额外加 : 30 5 00~83
        // ...
        // 情况2：
        // d == 0
        // 1 ~ 30583 d = 0
        // cur > d的情况
        // 个位cur=3 : 0001~3057 0
        // 个位上额外加 : 3058 0
        //
        // cur > d的情况
        // 十位cur=8 : 001~304 0 0~9
        // 十位上额外加 : 305 0 0~9
        //
        // cur > d的情况
        // 百位cur=5 : 01~29 0 00~99
        // 百位上额外加 : 30 0 00~99
        //
        // cur == d的情况
        // 千位cur=0 : 1~2 0 000~099
        // 千位上额外加 : 3 0 000~583
        left = tmp / 10;
        cur = tmp % 10;
        if(d == 0) --left;
        ans += left * right;
        if(cur > d) ans += right;
        else if(cur == d) ans += num % right + 1;
    }
    return ans;
}

long digitsCount(int d, long a, long b)
{
    return count(b, d) - count(a - 1, d);
}

int main()
{
    long a, b;
    scanf("%ld%ld", &a, &b);
    for(int i = 0; i <= 9; ++i)
    {
        printf("%ld ", digitsCount(i, a, b));
    }
    printf("\n");

    return 0;
}

}


namespace Code2
{

#include <bits/stdc++.h>

using namespace std;
const int MAXN = 13;
long dp[MAXN][MAXN];

inline long read()
{
    char ch = getchar();
    long x = 0, f = 1;
    while(ch < '0' || ch > '9')
    {
        if(ch == '-') f = -1;
        ch = getchar();
    }
    while(ch >= '0' && ch <= '9')
    {
        x = 10 * x + ch - '0';
        ch = getchar();
    }
    return f * x;
}

long count(long n, int digit)
{
    auto s = to_string(n);
    int m = s.size();
    memset(dp, -1, sizeof(dp));

    /*
    cnt 表示前面填了多少个 digit

    is_limit 表示当前是否受到了 n 的约束。若为真，则第 i 为填入的
    数字至多为 s[i]，否则可以是 9，如果在受到约束的情况下填了 s[i]，
    那么后续填入的数字仍会受到 n 的约束。

    is_num 表示 i 前面的数位是否填了数字。若为假，则当前位可以跳过
    （不填数字），或者要填入的数字至少为 1；若为真，则要填入的数字
    可以从 0 开始。

    在本题中，因为 digit 可能是 0，因此要考虑前导零，所以 is_num 不可以省略
    */
    function<long(int, int, bool, bool)> f = [&](int i, int cnt, bool is_limit, bool is_num) -> long
    {
        // 需要判断是否数字是否合法
        if(i == m) return is_num ? cnt : 0;
        // 缓存命中
        if(!is_limit && is_num && dp[i][cnt] != -1) return dp[i][cnt];

        long ret = 0;
        if(!is_num) ret = f(i + 1, cnt, false, false);
        int up = is_limit ? s[i] - '0' : 9;
        for(int d = 1 - is_num; d <= up; ++d) // 枚举要填入的数字 d
        {
            ret += f(i + 1, cnt + (d == digit), is_limit && d == up, true);
        }
        if(!is_limit && is_num) dp[i][cnt] = ret;
        return ret;
    };

    return f(0, 0, true, false);
}

long digitsCount(int d, long a, long b)
{
    return count(b, d) - count(a - 1, d);
}

int main()
{
    long a = read(), b = read();
    for(int i = 0; i <= 9; ++i)
    {
        printf("%ld ", digitsCount(i, a, b));
    }
    printf("\n");

    return 0;
}

}